package slogx

import (
	"context"
	"log/slog"
)

// WithTraceID 将 trace_id 注入上下文
func WithTraceID(ctx context.Context, traceID string) context.Context {
	return context.WithValue(ctx, "trace_id", traceID)
}

// FromContext 解析 trace_id 为 slog.Attr
func FromContext(ctx context.Context) []slog.Attr {
	traceID, ok := ctx.Value("trace_id").(string)
	if !ok || traceID == "" {
		return nil
	}
	return []slog.Attr{slog.String("trace_id", traceID)}
}

// ---------- 以下为四级别通用输出 ----------

// Debug
func Debug(msg string, args ...any) {
	L().LogAttrs(context.Background(), slog.LevelDebug, msg, toAttrs(args...)...)
}

// Info
func Info(msg string, args ...any) {
	L().LogAttrs(context.Background(), slog.LevelInfo, msg, toAttrs(args...)...)
}

// Warn
func Warn(msg string, args ...any) {
	L().LogAttrs(context.Background(), slog.LevelWarn, msg, toAttrs(args...)...)
}

// Error
func Error(msg string, args ...any) {
	L().LogAttrs(context.Background(), slog.LevelError, msg, toAttrs(args...)...)
}

// 带 Context 的版本
func DebugCtx(ctx context.Context, msg string, args ...any) {
	L().LogAttrs(ctx, slog.LevelDebug, msg, append(FromContext(ctx), toAttrs(args...)...)...)
}

func InfoCtx(ctx context.Context, msg string, args ...any) {
	L().LogAttrs(ctx, slog.LevelInfo, msg, append(FromContext(ctx), toAttrs(args...)...)...)
}

func WarnCtx(ctx context.Context, msg string, args ...any) {
	L().LogAttrs(ctx, slog.LevelWarn, msg, append(FromContext(ctx), toAttrs(args...)...)...)
}

func ErrorCtx(ctx context.Context, msg string, args ...any) {
	L().LogAttrs(ctx, slog.LevelError, msg, append(FromContext(ctx), toAttrs(args...)...)...)
}

// 辅助：将 key/value 参数转为 Attr
func toAttrs(args ...any) []slog.Attr {
	var attrs []slog.Attr
	for i := 0; i+1 < len(args); i += 2 {
		k, v := args[i], args[i+1]
		if key, ok := k.(string); ok {
			attrs = append(attrs, slog.Any(key, v))
		}
	}
	return attrs
}
